001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Apr 16, 2003
005 * Time: 11:31:25 PM
006 */
007
008 package EVolve.util;
009
010 import EVolve.Scene;
011 import EVolve.ProcessingThread;
012
013 import javax.swing.*;
014 import java.awt.*;
015 import java.awt.event.*;
016 import java.text.NumberFormat;
017 import EVolve.data.Worker;
018
019 public class ProgressIndicator extends JDialog implements Runnable{
020 private JProgressBar progressBar;
021 private JButton buttonPause, buttonResume, buttonStop;
022 private Thread self = null;
023 private Worker worker;
024 private boolean mustStop;
025 private ProcessingThread workerTd;
026
027 public ProgressIndicator(JFrame owner, Worker worker, ProcessingThread workerTd) {
028 super(owner,"Process progress");
029
030 mustStop = false;
031 this.worker = worker;
032 this.workerTd = workerTd;
033 createUI();
034 repaint();
035 self = new Thread(this);
036 self.start();
037 }
038
039 private void createUI() {
040 setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
041
042 progressBar = new JProgressBar();
043 JPanel panelButton = new JPanel(new GridLayout(1,3));
044
045 buttonResume = new JButton(new ImageIcon(Scene.getGifURL("play.gif")));
046 buttonResume.setToolTipText("Resume Processing");
047 buttonResume.addActionListener(new ActionListener() {
048 public void actionPerformed(ActionEvent e) {
049 resume();
050 }
051 });
052 buttonResume.setPreferredSize(new java.awt.Dimension(30,25));
053 buttonResume.setEnabled(false);
054
055 buttonPause = new JButton(new ImageIcon(Scene.getGifURL("pause.gif")));
056 buttonPause.setToolTipText("Pause Processing");
057 buttonPause.addActionListener(new ActionListener() {
058 public void actionPerformed(ActionEvent e) {
059 pause();
060 }
061 });
062 buttonPause.setPreferredSize(new java.awt.Dimension(30,28));
063
064 buttonStop = new JButton(new ImageIcon(Scene.getGifURL("stop.gif")));
065 buttonStop.setToolTipText("Stop Processing");
066 buttonStop.addActionListener(new ActionListener() {
067 public void actionPerformed(ActionEvent e) {
068 stop();
069 }
070 });
071 buttonStop.setPreferredSize(new java.awt.Dimension(30,28));
072
073 panelButton.add(buttonResume);
074 panelButton.add(buttonPause);
075 panelButton.add(buttonStop);
076
077 Box box = new Box(BoxLayout.Y_AXIS);
078 progressBar.setPreferredSize(new Dimension(290,25));
079
080 box.add(Box.createVerticalStrut(8));
081 box.add(progressBar);
082 box.add(Box.createVerticalStrut(5));
083 box.add(panelButton);
084 getContentPane().add(box);
085 progressBar.setStringPainted(true);
086 progressBar.setValue(0);
087 progressBar.setBorderPainted(true);
088 pack();
089 Scene.getUIManager().showDialog(this,300,100);
090 }
091
092 public void run() {
093 Scene.getUIManager().updateFunctionControl(false);
094
095 long totalEvents = worker.getMaxProgress();
096 while (worker.getCurrentState() == Worker.STATE_NOT_STARTED) {
097 self.yield();
098 }
099
100 while (worker.getCurrentState() != Worker.STATE_FINISHED) {
101 try {
102 long current = worker.getCurrentProgress();
103 double percent = (double)current/(double)totalEvents;
104 if (totalEvents > 0L) {
105 progressBar.setValue((int)(percent*100));
106 progressBar.setString("Data processed: " + NumberFormat.getPercentInstance().format(percent));
107 }
108 self.sleep(100);
109 } catch (InterruptedException e) {
110 if (mustStop || worker.getCurrentState() >= Worker.STATE_STOPPING) {
111 break;
112 }
113 }
114 }
115 progressBar.setValue(100);
116 progressBar.setString("Data processed: " + NumberFormat.getPercentInstance().format(1));
117 try {
118 workerTd.join();
119 } catch (InterruptedException e1) {
120 }
121 setVisible(false);
122 dispose();
123 worker.resetState();
124 Scene.getUIManager().updateFunctionControl(true);
125 }
126
127 public void stop(){
128 worker.stop();
129 if (self != null) {
130 mustStop = true;
131 self.interrupt();
132 }
133 Scene.getUIManager().updateFunctionControl(true);
134 self = null;
135 setVisible(false);
136 dispose();
137 }
138
139 public void resume() {
140 buttonResume.setEnabled(false);
141 buttonPause.setEnabled(true);
142 worker.resume();
143 }
144
145 public void pause() {
146 buttonResume.setEnabled(true);
147 buttonPause.setEnabled(false);
148 worker.pause();
149 }
150 }